package services

import (
	"blog-backend/internal/app/dtos"
	"blog-backend/internal/app/models"
	"blog-backend/internal/app/repositories"
	"blog-backend/pkg/auth"
	"errors"
	"golang.org/x/crypto/bcrypt"
)

type AuthService struct {
	userRepo *repositories.UserRepository
}

func NewAuthService() *AuthService {
	return &AuthService{
		userRepo: repositories.NewUserRepository(),
	}
}

// Register 用户注册
func (s *AuthService) Register(dto dtos.RegisterDto) (*models.User, error) {
	// 检查用户名是否已存在
	if s.userRepo.UsernameExists(dto.Username) {
		return nil, errors.New("用户名已被使用")
	}

	// 检查邮箱是否已存在
	if s.userRepo.EmailExists(dto.Email) {
		return nil, errors.New("邮箱已被使用")
	}

	// 密码加密
	hashedPassword, err := bcrypt.GenerateFromPassword([]byte(dto.Password), bcrypt.DefaultCost)
	if err != nil {
		return nil, errors.New("密码加密失败")
	}

	// 创建用户
	user := &models.User{
		Username: dto.Username,
		Email:    dto.Email,
		Password: string(hashedPassword),
	}

	if err := s.userRepo.Create(user); err != nil {
		return nil, errors.New("创建用户失败")
	}

	return user, nil
}

// Login 用户登录
func (s *AuthService) Login(dto dtos.LoginDto) (string, *models.User, error) {
	// 根据邮箱获取用户
	user, err := s.userRepo.GetByEmail(dto.Email)
	if err != nil {
		return "", nil, errors.New("用户不存在")
	}

	// 验证密码
	if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(dto.Password)); err != nil {
		return "", nil, errors.New("密码错误")
	}

	// 生成JWT令牌
	token, err := auth.GenerateToken(user.ID)
	if err != nil {
		return "", nil, errors.New("令牌生成失败")
	}

	return token, user, nil
}

// GetProfile 获取用户信息
func (s *AuthService) GetProfile(userID uint) (*models.User, error) {
	user, err := s.userRepo.GetByID(userID)
	if err != nil {
		return nil, errors.New("用户不存在")
	}
	
	// 敏感信息处理
	user.Password = ""
	return user, nil
}

// UpdateProfile 更新用户信息
func (s *AuthService) UpdateProfile(userID uint, dto dtos.UpdateProfileDto) (*models.User, error) {
	user, err := s.userRepo.GetByID(userID)
	if err != nil {
		return nil, errors.New("用户不存在")
	}

	// 更新基本信息
	if dto.Username != "" && dto.Username != user.Username {
		if s.userRepo.UsernameExists(dto.Username) {
			return nil, errors.New("用户名已被使用")
		}
		user.Username = dto.Username
	}

	if dto.Bio != "" {
		user.Bio = dto.Bio
	}

	if dto.Website != "" {
		user.Website = dto.Website
	}

	if dto.Avatar != "" {
		user.Avatar = dto.Avatar
	}

	// 更新密码
	if dto.OldPassword != "" && dto.NewPassword != "" {
		if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(dto.OldPassword)); err != nil {
			return nil, errors.New("原密码错误")
		}
		
		hashedPassword, err := bcrypt.GenerateFromPassword([]byte(dto.NewPassword), bcrypt.DefaultCost)
		if err != nil {
			return nil, errors.New("密码加密失败")
		}
		user.Password = string(hashedPassword)
	}

	if err := s.userRepo.Update(user); err != nil {
		return nil, errors.New("更新用户信息失败")
	}

	// 返回更新后的用户信息
	user.Password = ""
	return user, nil
}